package com.skyd.core.vector;

import android.graphics.Rect;
import android.graphics.RectF;

/**
 * 表示二维向量矩形
 * 
 * @author SkyD
 * 
 */
public class VectorRect2DF {

	/**
	 * 构造函数
	 * 
	 * @param position
	 *            位置
	 * @param size
	 *            尺寸
	 */
	public VectorRect2DF(Vector2DF position, Vector2DF size) {
//		Vector2DF pointa = position;
//		Vector2DF pointb = position.plusNew(size);
//		float left = Math.min(pointa.getX(), pointb.getX());
//		float right = Math.max(pointa.getX(), pointb.getX());
//		float top = Math.min(pointa.getY(), pointb.getY());
//		float bottom = Math.max(pointa.getY(), pointb.getY());
//		setPosition(new Vector2DF(left, top));
//		setSize(new Vector2DF(right - left, bottom - top));
		setPosition(position);
		setSize(size);
	}

	/**
	 * 构造函数
	 * 
	 * @param left
	 *            左边左边
	 * @param top
	 *            上边坐标
	 * @param right
	 *            右边坐标
	 * @param bottom
	 *            下边坐标
	 */
	public VectorRect2DF(float left, float top, float right, float bottom) {
		setPosition(new Vector2DF(left, top));
		setSize(new Vector2DF(right - left, bottom - top));
	}

	/**
	 * 构造函数
	 * 
	 * @param rect
	 *            矩形
	 */
	public VectorRect2DF(RectF rect) {
		setPosition(new Vector2DF(rect.left, rect.top));
		setSize(new Vector2DF(rect.right - rect.left, rect.bottom - rect.top));
	}

	/**
	 * 初始值为null。 功能注释：位置
	 */
	private Vector2DF _Position = null;

	/**
	 * 获取Position。 功能注释：位置
	 * 
	 * @return 当前的Vector2DF类型的值
	 */
	public Vector2DF getPosition() {
		return _Position;
	}

	/**
	 * 设置Position。 功能注释：位置
	 * 
	 * @param value
	 *            要设置的Vector2DF类型值
	 */
	public void setPosition(Vector2DF value) {
		_Position = value;
	}

	/**
	 * 设置Position为其默认值(null)。 功能注释：位置
	 */
	public void setPositionToDefault() {
		setPosition(null);
	}

	/**
	 * 初始值为null。 功能注释：尺寸
	 */
	private Vector2DF _Size = null;

	/**
	 * 获取Size。 功能注释：尺寸
	 * 
	 * @return 当前的Vector2DF类型的值
	 */
	public Vector2DF getSize() {
		return _Size;
	}

	/**
	 * 设置Size。 功能注释：尺寸
	 * 
	 * @param value
	 *            要设置的Vector2DF类型值
	 */
	public void setSize(Vector2DF value) {
		_Size = value;
	}

	/**
	 * 设置Size为其默认值(null)。 功能注释：尺寸
	 */
	public void setSizeToDefault() {
		setSize(null);
	}

	/**
	 * 获取左边坐标
	 * 
	 * @return 左边坐标
	 */
	public float getLeft() {
		return getPosition().getX();
	}

	/**
	 * 获取上边坐标
	 * 
	 * @return 上边坐标
	 */
	public float getTop() {
		return getPosition().getY();
	}

	/**
	 * 获取右边坐标
	 * 
	 * @return 右边坐标
	 */
	public float getRight() {
		return getPosition().getX() + getSize().getX();
	}

	/**
	 * 获取下边坐标
	 * 
	 * @return 下边坐标
	 */
	public float getBottom() {
		return getPosition().getY() + getSize().getY();
	}

	/**
	 * 获取宽度
	 * 
	 * @return 宽度
	 */
	public float getWidth() {
		return getSize().getX();
	}

	/**
	 * 获取高度
	 * 
	 * @return 高度
	 */
	public float getHeight() {
		return getSize().getY();
	}

	/**
	 * 获取矩形
	 * 
	 * @return 矩形
	 */
	public RectF getRectF() {
		return new RectF(getLeft(), getTop(), getRight(), getBottom());
	}
	
	/**
	 * 获取经过修正后的矩形，其left一定小于等于right，top一定小于等于bottom
	 * @return 矩形
	 */
	public RectF getFixedRectF(){
		Vector2DF pointa = _Position;
		Vector2DF pointb = _Position.plusNew(_Size);
		float left = Math.min(pointa.getX(), pointb.getX());
		float right = Math.max(pointa.getX(), pointb.getX());
		float top = Math.min(pointa.getY(), pointb.getY());
		float bottom = Math.max(pointa.getY(), pointb.getY());
		return new RectF(left, top, right, bottom);
	}

	/**
	 * 获取矩形
	 * 
	 * @return 矩形
	 */
	public Rect getRect() {
		return new Rect((int) Math.round(getLeft()), (int) Math.round(getTop()),
				(int) Math.round(getRight()), (int) Math.round(getBottom()));
	}

	/**
	 * 获取相交矩形，如果没有相交则返回null
	 * 
	 * @param target
	 *            目标对象
	 * @return 相交部分的矩形对象
	 */
	public VectorRect2DF getIntersectRect(VectorRect2DF target) {
		float px = Math.max(this.getLeft(), target.getLeft());
		float py = Math.max(this.getTop(), target.getTop());
		float sx = Math.min(this.getRight(), target.getRight());
		float sy = Math.min(this.getBottom(), target.getBottom());
		if (px > sx || py > sy)
			return null;
		return new VectorRect2DF(px, py, sx, sy);
	}
	
	/**
	 * 获取组合后的矩形，该矩形区域将可容纳当前矩形与目标矩形
	 * @param target 目标对象
	 * @return 组合后的矩形
	 */
	public VectorRect2DF getCombinationRect(VectorRect2DF target){
		float px = Math.min(this.getLeft(), target.getLeft());
		float py = Math.min(this.getTop(), target.getTop());
		float sx = Math.max(this.getRight(), target.getRight());
		float sy = Math.max(this.getBottom(), target.getBottom());
		return new VectorRect2DF(px,py,sx,sy);
	}
}
